package com.kila.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
public class LogBefroeAnnotation {
    //属性：定义切入点
    @Before( "execution(public * addStudent(..))")
   public void before(){
        System.out.println("@@@@00注解形式前置通知");
   }

   //后置通知
   @AfterReturning(pointcut = "execution(public * com.kila.dao.impl.IStudentDaoImpl.addStudent(..) )",returning = "returningValue")
   public void myAfter(JoinPoint jp, Object returningValue){
       System.out.println("注解后置通知 目标对象："+jp.getTarget()+
               "方法名："+jp.getSignature().getName()+
               "参数列表"+jp.getArgs().length+"返回值"+returningValue);
   }



    //异常通知
    //如果捕获特定异常需要第二参数 例如 NullPointerException e
    @AfterThrowing(pointcut= "execution(public * com.kila.dao.impl.IStudentDaoImpl.addStudent(..))",throwing = "e" )
    public void myException(JoinPoint jp,Exception e){
          System.out.println("注解形式的异常通知-------------"+e.getMessage());
    }

    //环绕通知
    @Around("execution(public * addStudent(..))")
    public void myAround(ProceedingJoinPoint pj ){
             //方法之前
        System.out.println("注解环绕通知 前置通知");

          try{
              //执行方法之时
               pj.proceed();

              //执行方法之后
              System.out.println("注解环绕通知 后置通知");
          }catch (Throwable e){
              //发生异常时
          }finally {
              //最终通知
              System.out.println("注解环绕通知 最终通知");
          }
    }

    //最终通知
    @After("execution(public * addStudent(..))")
    public void myAfter(){
        System.out.println("注解 最终通知");
    }
}
